import os
import struct
import time


class JoyStick:
    def __init__(self):
        print('avaliable devices')
        for fn in os.listdir('/dev/input'):
            if fn.startswith('js'):
                print('/dev/input/%s' % fn)

        self.fn = '/dev/input/js0'
        self.x_axis = 0

    def open(self):
        self.jsdev = open(self.fn, 'rb')

    def read(self):
        """读取8字节的游戏手柄输入事件数据并解析"""
        self.evbuf = self.jsdev.read(8)
        return struct.unpack('IhBB', self.evbuf)

    def type(self, type_):
        """根据事件类型字节判断事件是按键还是轴
        
        参数:
            type_: 从输入事件中获取的类型字节
        
        返回:
            "button" 或 "axis"，表示事件类型
        """
        if type_ & 0x01:
            return "button"
        if type_ & 0x02:
            return "axis"

    def button_state(self):
        """获取按键状态，目前固定返回1（按下状态）"""
        return 1

    def get_x_axis(self):
        """解析X轴(编号为1)的模拟量值
        
        返回:
            float: X轴的归一化值，范围从-1.0到1.0
                   如果当前事件不是X轴事件则返回None
        """
        time, value, type_, number = struct.unpack('IhBB', self.evbuf)
        if number == 1:
            fvalue = value / 32767
            return fvalue
            
